@tool
class_name AdditionalEffect_FaceVel
extends AdditionalEffect

#region 属性
## 默认是否面向右边
@export var is_face_right:bool = true
## 是否允许x轴翻转
@export var flip_h:bool = true
## 是否允许y轴翻转
@export var flip_v:bool = false
## 是否允许通过旋转面向速度方向
@export var enable_rotated:bool = false
#endregion
#region 字段
#endregion
#region 信号
#endregion

#region 基类方法
## 初始化
func init(args:Dictionary = {}):
	if super(args):
		return true
	return false
## 检查能否执行添加效果，默认为true
func can_excute() -> bool:
	return super()
## 执行添加效果
func excute() -> bool:
	if super():
		target = target as Entity
		var runtime_velocity:Vector2 = target.entity_data.get_attribute_value("Vel")
		# 忽略速度为零的情况
		if runtime_velocity.length() < 0.001:
			return true
		
		if enable_rotated:
			var new_scale = Vector2(abs(target.root.scale.x), abs(target.root.scale.y))
			
			# 处理垂直翻转
			if flip_v and runtime_velocity.y < 0:
				new_scale.y *= -1
			
			var angle = runtime_velocity.angle()
			var moving_right = runtime_velocity.x >= 0.001 or (abs(runtime_velocity.x) < 0.001 and target.root.scale.y > 0)
			var should_flip_h = flip_h and (moving_right != is_face_right)
			
			# 核心修改：处理左方向镜像
			if should_flip_h:
				angle += PI
				new_scale.x *= -1  # 添加水平缩放翻转
			elif not is_face_right:
				angle += PI  # 默认朝左时基础角度
			
			# 角度规范化
			angle = fmod(angle, TAU)
			target.root.rotation = angle
			target.root.scale = new_scale
		else:
			# 不旋转时的处理逻辑
			
			# 准备缩放变量
			var new_scale = Vector2(abs(target.root.scale.x), abs(target.root.scale.y))
			
			# 处理垂直翻转（通过缩放）
			if flip_v and runtime_velocity.y < 0:
				new_scale.y *= -1
			
			# 初始旋转
			var base_rotation = 0.0
			
			# 判断朝向和镜像
			var moving_right = runtime_velocity.x >= 0.001 or (abs(runtime_velocity.x) < 0.001 and target.root.scale.y > 0)
			
			# 确定旋转角度
			if is_face_right:
				# 默认朝右
				if not moving_right and flip_h:
					# 如果速度向左且允许水平翻转
					base_rotation = PI
					new_scale.y *= -1
			else:
				# 默认朝左
				if moving_right and flip_h:
					# 如果速度向右且允许水平翻转
					base_rotation = 0
				else:
					# 保持朝左
					base_rotation = PI
			
			# 应用旋转和缩放
			target.root.rotation = base_rotation
			target.root.scale = new_scale
			
		return true
	else:
		return false
## 取消执行的效果
func cancel_excute() -> bool:
	if super():
		return true
	else:
		return false
#endregion
#region 公共方法
#endregion
#region 私有方法
#endregion
#region 生命周期函数
func _init() -> void:
	if Engine.is_editor_hint():
		resource_local_to_scene = true
#endregion
